前幾篇在 if-else 以及 case 語句時有提到 latch,那什麼是 latch 呢?
latch 又俗稱"鎖存器",它是以電平(High or Low)觸發的一種存儲單元,資料儲存動作將取決於致能(enable)的電平值,當 latch 被致能時,此時輸入會等於輸出,也就是輸出會隨輸入的變化而產生變化,而不被致能時,輸出則與輸入無關,而且保持前態。
說到這裡,那麼 flip-flop 又是什麼呢?
flip-flop 跟 latch 有點類似,但是 flip-flop 是邊緣觸發的儲存單元,也就是只有在正緣或負緣這段極短的時間內
輸出狀態才會改變,它也就是一般我們 Verilog 中 reg 期望它綜合出來的元件。
為甚麼會說是期望?因為 reg 在綜合時,有時會因為撰寫的程式碼有瑕疵導致reg被綜合成我們不期待的 latch。
我們再來提到亞穩態
,它是指觸發器在某一段時間內無法達到一個正確的值,我們又知道 "1" 到 "0" 及 "0" 到 "1" 不是完全不需要時間的,此時觸發器的輸出端 Q 在較長時間內處於振盪狀態,且不會等於輸入端 D,而這段時間也會被稱做 resolution time
,而其主要原因還是要歸咎於觸發器不夠快,無法滿足 setup time/hold time,所以在輸出為一個確定的值之前,它有可能是毛刺
、震盪
、或是其他不穩定的值。
再來剛剛提到 latch 被致能時,輸出完全的由輸入來決定,而且這段時間不是很短的,這種情形就會很危險,很容易將前一級的不穩定狀態傳遞給後級,導致整體電路發生問題,也會讓時序分析變得更加複雜。
加上 latch 在 FPGA 資源中往往需要耗更多資源來合成,耗費更多的面積,那麼以上就是我們詬病 latch 的原因。